home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / extdrv / src / disk.c < prev    next >
C/C++ Source or Header  |  1994-11-16  |  2KB  |  114 lines

  1. #include "extdrv.h"
  2. #include "regdef.h"
  3. #include "disk.h"
  4. #include "dir.h"
  5. #include "file.h"
  6. #include "buffer.h"
  7. #include "dos.h"
  8. #include "extern.h"
  9.  
  10. extern int drvmap[];
  11. extern u_char *dmabuf;
  12.  
  13. void drive_chk()
  14. {
  15.     char buf[256];
  16.     extern u_long max_cluster_size;
  17.  
  18.     if (dp->n_rdir == 0){
  19.         if (drvInit(dp->drvno, dp->devno & 0x0f, dp->part) < 0)
  20.             return;
  21.         if (dp->n_rdir != 0){ /* ready */
  22.             inquiry(dp->devno, buf);
  23.             dp->removable = (buf[1] & 0x80);
  24.         }
  25.         inv_buffer(dp->devno);
  26.         inv_root(dp->devno);
  27.         inv_fat(dp->devno);
  28.     } else {
  29.         if (reqsense(dp->devno, buf) == 0){
  30.             if (buf[0] == 0x70  &&  (buf[2] & 0x0f) == UNIT_ATN){
  31. #ifdef DEBUG
  32.                 auxputs("<DISK#");
  33.                 auxprinthex((u_long)(dp->devno & 0x0f));
  34.                 auxputs(" media changed>\r\n");
  35. #endif
  36.                 drvInit(dp->drvno, dp->devno & 0x0f, dp->part);
  37.                 inv_buffer(dp->devno);
  38.                 inv_root(dp->devno);
  39.                 inv_fat(dp->devno);
  40.                 dp->removable &= ~0x0100;
  41.             }
  42.         }
  43.     }
  44.     if (dp->clustsize > max_cluster_size){
  45. #ifdef DEBUG
  46.         auxprinthex(max_cluster_size);
  47. #endif
  48.         flush_buffer(NULL, 0, BUF_FILE, TRUE);
  49.         flush_buffer(NULL, 0, BUF_DIR, TRUE);
  50. #ifdef DEBUG
  51.         auxputs("-->");
  52. #endif
  53.         max_cluster_size = dp->clustsize;
  54. #ifdef DEBUG
  55.         auxprinthex(max_cluster_size);
  56. #endif
  57.         cluster_init();
  58. #ifdef DEBUG
  59.         auxputs("\r\n");
  60. #endif
  61.     }
  62. }
  63.  
  64. static u_short getDrvFree(struct drvinfo far *d)
  65. {
  66.     u_short i, free;
  67.  
  68.     free = 0;
  69.     for (i = 2; i < d->n_clust + 2; i++){
  70.         if (!fat_decode(d, i))
  71.             free++;
  72.     }
  73.     d->freearea = (u_long)free;
  74.     return(free);
  75. }
  76.  
  77. getDiskFree()
  78. {
  79.     u_int drv;
  80.     long freearea;
  81.     struct idrvinfo far *d;
  82.     struct drvinfo far *p;
  83.     int org_apl3;
  84.  
  85.     org_apl3 = get_apl3();
  86.     set_apl3(org_apl3 | 0x80);
  87. #ifdef DEBUG
  88.     auxputs("getDiskFree ");
  89. #endif
  90.     d = (struct idrvinfo far *)FAR(regs.es, regs.di);
  91.     drv = d->curdir[0] - 'A';
  92.     p = drives + drvmap[drv];
  93.     if ((freearea = p->freearea) < 0L){
  94.         freearea = (long)getDrvFree(p) & 0xffffL;
  95.         p->fatid = (u_long)fat_read(p, 0L);
  96.     }
  97.     regs.ax = (p->fatid  << 8) | p->cluster;
  98.     regs.bx = p->n_clust;
  99.     regs.cx = p->sectsiz;
  100.     regs.dx = freearea;
  101. #ifdef DEBUG
  102.     auxprinthex((u_long)regs.ax);
  103.     auxputs(" ");
  104.     auxprinthex((u_long)regs.bx);
  105.     auxputs(" ");
  106.     auxprinthex((u_long)regs.cx);
  107.     auxputs(" ");
  108.     auxprinthex((u_long)regs.dx);
  109.     auxputs("\r\n");
  110. #endif
  111.     set_apl3(org_apl3);
  112.     OK_RET
  113. }
  114.